﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using System.Data;
using System.Windows.Controls;
using System.Globalization;
using System.Windows.Data;
using System.Windows;
using System.Reflection;
using System.Net.Mail;
using System.Configuration;
using System.Security.Cryptography;
using System.IO;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Input;
using System.ComponentModel;
using produccion.AccesoDatos;


namespace produccion
{
    public class MDOgeneral
    {

        #region Metodos y propiedades para conectar y ejecutar comandos a la BD

        public static OracleConnection conexion;
        public static OracleConnection ConexionBogota;
        public static string strBD;
        public static string strUsu;
        public static string strCla;
        public static OracleTransaction transaccion;
        public static OracleCommand spComando = new OracleCommand();
        public static OracleCommand spComandoBogota=new OracleCommand();

        public static string strEmpresaImprime;
        public static Boolean BooConexionDinamica;
        public static string strConexionBaseDeDatos;
        public static string strEmpresaImprimeNit;
        public static string strEmpresaImprimeDireccion;
        public static string strEmpresaImprimeSoloDireccion;
        public static string strEmpresaImprimeSoloTelefono;
        public static string strEmpresaImprimeCiudad;
        public static string strEmpresaImprimeFax;

        public static string strConsultasTemporalesSql1;//FJRF - Para guardar Sql temporales 1
        public static string strConsultasTemporalesSql2;//FJRF - Para guardar Sql temporales 2

        public static string strImprimirNoCopias;//FJRF - Para imprimir numero de copias debe llevar de donde viene y el parametro de numedo de copias ejemplo: 1-FrmNombreFormulario

        public static String StrConsultas;//FJRF - Para consultas genericas
        public static String StrRutaAplicacion;//FJRF - para saber la ruta de la aplicacion donde esta instalada
        public static String StrRutaAplicacionReportes;//FJRF - para saber la ruta de la aplicacion donde esta instalada para los reportes
        public static DataTable DtConsulta = new DataTable();//FJRF - Para consultas genericas

        //FJRF - Variables para validaciones de mes y año en todo el sistema
        public static int IntAñoDeValidacionEnElSistema;//FJRF - Esta variable contendra el año en el que el usuario debera trabajar en el sistema se carga al iniciar el sistema en el formulario de login
        public static int IntMesDeValidacionEnElSistema;//FJRF - Esta variable contendra el mes en el que el usuario debera trabajar en el sistema se carga al iniciar el sistema en el formulario de login
        public static DateTime DttFechaActualDeValidacionEnElSistema;//FJRF - Es la fecha que tendra el datapicker cuando se inicia el modulo
        public static DateTime DttFechaInicialDeValidacionEnElSistema;//FJRF - Es el rango inicial que mostrara el objeto que muestra la fecha
        public static DateTime DttFechaFinalDeValidacionEnElSistema;//FJRF - Es el rango final que mostrara el objeto que muestra la fecha
        public static DateTime DttFechaDigitadaPorusuario;//FJRF - Es para validar el dato que digite el usuario
        //FJRF - Variables para la impresion de documentos
        public static string strRutaImpresionDocumentos;//FJRF - Esta variable contiene la ruta donde se generan los documentos para impresion
        public static String StrSoloClientesComerciales = "S";//FJRF - Para saber si un cliente es comercial o no se una solo para reportes
        public static String StrNuevoTituloTalla1, StrNuevoTituloTalla2, StrNuevoTituloTalla3, StrNuevoTituloTalla4, StrNuevoTituloTalla5, StrNuevoTituloTalla6, StrNuevoTituloTalla7, StrNuevoTituloTalla8, StrNuevoTituloTalla9, StrNuevoTituloTalla10;//FJRF - Para el manejo de las tallas
        public static String StrNuevoTituloTalla11, StrNuevoTituloTalla12, StrNuevoTituloTalla13, StrNuevoTituloTalla14, StrNuevoTituloTalla15, StrNuevoTituloTalla16, StrNuevoTituloTalla17, StrNuevoTituloTalla18, StrNuevoTituloTalla19, StrNuevoTituloTalla20;//FJRF - Para el manejo de las tallas
        public static string strImpresionLPT2;//FJRF - Este es el mapeo que se le hace a la impresora donde se imprimen los documentos
        public static string strEmpresaConectada;//FJRF - Este es el mapeo que se le hace a la impresora donde se imprimen los documentos
        public static DataTable DtImpresorasCodigoBarras = new DataTable("DtImpresorasCodigoBarras");//FJRF - Este es el mapeo que se le hace a la impresora donde se imprimen los codigos de barras
        public static DataTable DtSumarCantidadesProcesos = new DataTable();//FJRF - Para sumar las cantidades de un proceso en un grid
        public static DataTable DtExplosiondeMateriales = new DataTable();//FJRF - Para tener la explosion de materiales
        public static DataRow drAgregarDatosImpresora;//FJRF - Este es el mapeo que se le hace a la impresora donde se imprimen los codigos de barras y con esto se agregan los datos
        public static DataSet DsConsultaImpresoras;//FJRF - Usamos este DataTable para hacer consultas de las impresoras

        public static string strConexionBogota = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.2.1.4)(PORT=1521))(CONNECT_DATA=(SID=BDSIC)));User Id=USU_DBA;Password=SIS2002;";//FJRF - String de conexcion solo para bogota

        public static Boolean logBusquedadAbierta;
        public static Boolean logBusquedadAbierta1;
        public static Boolean logBusquedadAbierta2;
        public static Boolean logLogin;

        //Crea un conexion permanente en la ejecucion del programa
        //PARA EJECUCION
        public static void conectar()
        {  
           try
            {
                BooConexionDinamica = true;//FJRF - Informamos que es una conexion dinamica
                strConexionBaseDeDatos = "Data Source=" + strBD + "; User Id=" + strUsu + ";Password=" + strCla + ";";
                conexion = new OracleConnection(strConexionBaseDeDatos);
                conexion.Open();
            }
            catch (Exception ex) { throw (ex); }
        }
        //PARA DISEÑO
        public static void conectar1()
        {
            try
            {
                BooConexionDinamica = false;//FJRF - Informamos que no es una conexion dinamica
                string cadena1 = "Data Source=" + strBD + "; User Id=" + strUsu + ";Password=" + strCla + ";";

                // Con string de conexion
                strConexionBaseDeDatos = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.10)(PORT=1521))(CONNECT_DATA=(SID=BDSIC)));User Id=USU_FBRPRB;Password=SIS2002;";

                conexion = new OracleConnection(strConexionBaseDeDatos);
                conexion.Open();
            }
            catch (Exception ex) { throw (ex); }
        }
        public static void ConectarBogota()
        {
            try
            {
                // Con string de conexion con bogota
                ConexionBogota = new OracleConnection(strConexionBogota);
                ConexionBogota.Open();
            }
            catch (Exception ex) { throw (ex); }
        }

        //Cierra la conexion permanente con la base de datos
        public static void DesconectarBogota()
        {
            try
            {
                if (ConexionBogota != null)
                {
                    ConexionBogota.Close();
                    ConexionBogota.Dispose();
                }
            }
            catch (Exception ex) { throw (ex); }
        }

        //Cierra la conexion permanente con la base de datos
        public static void desconectar()
        {
            try
            {
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex) { throw(ex);}
        }
        //Ejecuta consulta a la base de datos
        public DataTable ConsultaBogota(string query)
        {
            DataTable dt = new DataTable();

            if (String.IsNullOrEmpty(query) == false)//FJRF - Si trae datos hacer lo siguiente
            {
                if (MDOgeneral.ConexionBogota == null || MDOgeneral.ConexionBogota.State == ConnectionState.Closed)
                {
                    MDOgeneral.ConectarBogota();
                }

                dt.CaseSensitive = true;
                OracleCommand comando = new OracleCommand(query, ConexionBogota);

                try
                {
                    OracleDataReader registros = comando.ExecuteReader();

                    for (int i = 0; i < registros.FieldCount; i++)
                    {
                        dt.Columns.Add(registros.GetName(i), registros.GetFieldType(i));
                    }
                    while (registros.Read())
                    {
                        DataRow fila = dt.NewRow();
                        for (int i = 0; i < registros.FieldCount; i++)
                        {
                            if (registros[registros.GetName(i)].GetType().ToString().Equals("System.String"))
                            {
                                fila[registros.GetName(i)] = registros[registros.GetName(i)].ToString().Trim();
                            }
                            else
                            {
                                fila[registros.GetName(i)] = registros[registros.GetName(i)];
                            }

                        }
                        dt.Rows.Add(fila);
                    }
                    registros.Close();
                }
                catch (Exception ex) { throw (ex); }
            }
            return dt;
        }

        //Ejecuta consulta a la base de datos
        public DataTable consulta(string query)
        {
            DataTable dt = new DataTable();

            if (String.IsNullOrEmpty(query) == false)//FJRF - Si trae datos hacer lo siguiente
            {
                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }

                dt.CaseSensitive = true;
                OracleCommand comando = new OracleCommand(query, conexion);

                try
                {
                    OracleDataReader registros = comando.ExecuteReader();

                    for (int i = 0; i < registros.FieldCount; i++)
                    {
                        dt.Columns.Add(registros.GetName(i), registros.GetFieldType(i));
                    }
                    while (registros.Read())
                    {
                        DataRow fila = dt.NewRow();
                        for (int i = 0; i < registros.FieldCount; i++)
                        {
                            if (registros[registros.GetName(i)].GetType().ToString().Equals("System.String"))
                            {
                                fila[registros.GetName(i)] = registros[registros.GetName(i)].ToString().Trim();
                            }
                            else
                            {
                                fila[registros.GetName(i)] = registros[registros.GetName(i)];
                            }

                        }
                        dt.Rows.Add(fila);
                    }
                    registros.Close();
                }
                catch (Exception ex) { throw (ex); }
            }

            return dt;
        }

        #region FJRF - FUNCIONES PERSONALIZADAS
        public DataTable LinqRetornarDataTable<T>(IEnumerable<T> varlist)
        {
            DataTable dtReturn = new DataTable();

            // column names
            PropertyInfo[] oProps = null;

            if (varlist == null) return dtReturn;

            foreach (T rec in varlist)
            {
                // Use reflection to get property names, to create table, Only first time, others will follow
                if (oProps == null)
                {
                    oProps = ((Type)rec.GetType()).GetProperties();
                    foreach (PropertyInfo pi in oProps)
                    {
                        Type colType = pi.PropertyType;

                        if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
                        == typeof(Nullable<>)))
                        {
                            colType = colType.GetGenericArguments()[0];
                        }

                        dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
                    }
                }

                DataRow dr = dtReturn.NewRow();

                foreach (PropertyInfo pi in oProps)
                {
                    dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
                    (rec, null);
                }

                dtReturn.Rows.Add(dr);
            }
            return dtReturn;
        }

        public void ModificarTallasTituloGrid(DataGrid DtgGridAModificarElTituloDeLaTalla, String StrTallajeABuscar, int IntPosicionInicia)
        {
            #region FJRF - Ejecutamos el Sp que busca las tallas con el parametro recibido y buscamos los datos que retorna
            MDOgeneral.spComando.CommandText = "SP_TALLAJES";
            MDOgeneral.spComando.Connection = MDOgeneral.conexion;
            MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
            MDOgeneral.spComando.Parameters.Clear();

            //Input
            MDOgeneral.spComando.Parameters.Add("pva_tallajes", Oracle.DataAccess.Client.OracleDbType.Varchar2, 20).Value = StrTallajeABuscar;
            MDOgeneral.spComando.Parameters["pva_tallajes"].Direction = ParameterDirection.Input;

            //Output
            MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
            MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
            MDOgeneral.spComando.ExecuteNonQuery();

            String StrConsulta = "select * from tmptitulostalla";//FJRF - Armamos la consulta
            DataTable dtTallas = consulta(StrConsulta);//FJRF - Buscamos los datos
            #endregion

            #region FJRF - Cargamos las variables que tendran los nuevos titulos de las tallas del grid para procesos especiales que se necesiten
            StrNuevoTituloTalla1 = "T1";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla2 = "T2";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla3 = "T3";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla4 = "T4";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla5 = "T5";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla6 = "T6";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla7 = "T7";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla8 = "T8";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla9 = "T9";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla10 = "T10";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla11 = "T11";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla12 = "T12";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla13 = "T13";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla14 = "T14";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla15 = "T15";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla16 = "T16";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla17 = "T17";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla18 = "T18";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla19 = "T19";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            StrNuevoTituloTalla20 = "T20";//FJRF - Inicializamos la variable con el titulo que deberia tener por defecto
            #endregion

            foreach (DataRow DrNuevoNombreTalla in dtTallas.Rows)//FJRF - Recorremos el grid al que se le asignaran las nuevas tallas
            {
                #region FJRF - CargamosLosDatos
                StrNuevoTituloTalla1 = DrNuevoNombreTalla["T1_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla2 = DrNuevoNombreTalla["T2_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla3 = DrNuevoNombreTalla["T3_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla4 = DrNuevoNombreTalla["T4_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla5 = DrNuevoNombreTalla["T5_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla6 = DrNuevoNombreTalla["T6_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla7 = DrNuevoNombreTalla["T7_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla8 = DrNuevoNombreTalla["T8_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla9 = DrNuevoNombreTalla["T9_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla10 = DrNuevoNombreTalla["T10_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla11 = DrNuevoNombreTalla["T11_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla12 = DrNuevoNombreTalla["T12_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla13 = DrNuevoNombreTalla["T13_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla14 = DrNuevoNombreTalla["T14_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla15 = DrNuevoNombreTalla["T15_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla16 = DrNuevoNombreTalla["T16_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla17 = DrNuevoNombreTalla["T17_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla18 = DrNuevoNombreTalla["T18_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla19 = DrNuevoNombreTalla["T19_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                StrNuevoTituloTalla20 = DrNuevoNombreTalla["T20_TMP"].ToString();//FJRF - Asignamos el nuevo nombre que tendra la talla en una variable
                #endregion

                #region FJRF - Validamos los datos
                StrNuevoTituloTalla1 = StrNuevoTituloTalla1.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla2 = StrNuevoTituloTalla2.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla3 = StrNuevoTituloTalla3.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla4 = StrNuevoTituloTalla4.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla5 = StrNuevoTituloTalla5.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla6 = StrNuevoTituloTalla6.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla7 = StrNuevoTituloTalla7.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla8 = StrNuevoTituloTalla8.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla9 = StrNuevoTituloTalla9.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla10 = StrNuevoTituloTalla10.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas

                StrNuevoTituloTalla11 = StrNuevoTituloTalla11.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla12 = StrNuevoTituloTalla12.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla13 = StrNuevoTituloTalla13.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla14 = StrNuevoTituloTalla14.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla15 = StrNuevoTituloTalla15.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla16 = StrNuevoTituloTalla16.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla17 = StrNuevoTituloTalla17.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla18 = StrNuevoTituloTalla18.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla19 = StrNuevoTituloTalla19.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                StrNuevoTituloTalla20 = StrNuevoTituloTalla20.Replace("'", "''");//FJRF - Remplazamos este caracter especial por si viene en pulgadas
                #endregion

                #region FJRF - Modificamos los titulos de las columnas del grid
                if (DtgGridAModificarElTituloDeLaTalla.Columns.Count >= IntPosicionInicia)
                {
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia].Header = StrNuevoTituloTalla1;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 1].Header = StrNuevoTituloTalla2;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 2].Header = StrNuevoTituloTalla3;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 3].Header = StrNuevoTituloTalla4;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 4].Header = StrNuevoTituloTalla5;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 5].Header = StrNuevoTituloTalla6;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 6].Header = StrNuevoTituloTalla7;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 7].Header = StrNuevoTituloTalla8;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 8].Header = StrNuevoTituloTalla9;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 9].Header = StrNuevoTituloTalla10;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 10].Header = StrNuevoTituloTalla11;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 11].Header = StrNuevoTituloTalla12;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 12].Header = StrNuevoTituloTalla13;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 13].Header = StrNuevoTituloTalla14;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 14].Header = StrNuevoTituloTalla15;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 15].Header = StrNuevoTituloTalla16;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 16].Header = StrNuevoTituloTalla17;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 17].Header = StrNuevoTituloTalla18;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 18].Header = StrNuevoTituloTalla19;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                    DtgGridAModificarElTituloDeLaTalla.Columns[IntPosicionInicia + 19].Header = StrNuevoTituloTalla20;//FJRF - Asignamos el nuevo nombre al grid en la columna correspondiente
                }
                #endregion

                #region FJRF - Damos formato a las nuevas tallas y quitamos las que no tengan datos
                if (DtgGridAModificarElTituloDeLaTalla.Items.Count > 0)//FJRF - Si el grid tiene datos hacemos lo siguiente
                {
                    foreach (var ColumnaGrid in DtgGridAModificarElTituloDeLaTalla.Columns)//FJRF - Recorremos el grid
                    {
                        string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
                        strNombreColumna = DtgGridAModificarElTituloDeLaTalla.Columns[ColumnaGrid.DisplayIndex].Header.ToString();//FJRF - Extraemos el titulo que tenga la columna

                        #region FJRF - Quitamos las columas vacias Y damos formato
                        if (String.IsNullOrEmpty(strNombreColumna) == false)//FJRF - Si trae datos hacemos lo siguiente
                        {
                            #region FJRF - Damos formato a las columnas
                            if (
                                    strNombreColumna == StrNuevoTituloTalla1 || strNombreColumna == StrNuevoTituloTalla2 || strNombreColumna == StrNuevoTituloTalla3 || strNombreColumna == StrNuevoTituloTalla4 || strNombreColumna == StrNuevoTituloTalla5 ||
                                    strNombreColumna == StrNuevoTituloTalla6 || strNombreColumna == StrNuevoTituloTalla7 || strNombreColumna == StrNuevoTituloTalla8 || strNombreColumna == StrNuevoTituloTalla9 || strNombreColumna == StrNuevoTituloTalla10 ||
                                    strNombreColumna == StrNuevoTituloTalla11 || strNombreColumna == StrNuevoTituloTalla12 || strNombreColumna == StrNuevoTituloTalla13 || strNombreColumna == StrNuevoTituloTalla14 || strNombreColumna == StrNuevoTituloTalla15 ||
                                    strNombreColumna == StrNuevoTituloTalla16 || strNombreColumna == StrNuevoTituloTalla17 || strNombreColumna == StrNuevoTituloTalla18 || strNombreColumna == StrNuevoTituloTalla19 || strNombreColumna == StrNuevoTituloTalla20

                                )//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
                            {
                                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                                (ColumnaGrid as DataGridTextColumn).Binding.StringFormat = "{0:##,0;-##,0;  }";//FJRF - Enviamos el formato a la celda pero dejando un blanco si no tiene cero
                                (ColumnaGrid as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
                            }
                            #endregion
                        }
                        else//FJRF - Si no trae datos significa que el grid se modifico luego de generar la consulta entonces si no trae datos hacemos lo siguiente
                        {
                            DtgGridAModificarElTituloDeLaTalla.Columns[ColumnaGrid.DisplayIndex].Visibility = Visibility.Hidden;//FJRF - Ocultamos la columna
                        }
                        #endregion
                    }
                }
                #endregion
            }
        }

        public String StrRetornarUnSoloCampo(String StrNombreCampoABuscar, String StrNombreConElCualQuiereQueRetorneElCampo, String StrNombreDeLaTablaDondeSeDebeBuscar, String StrCondicionDeBusquedaSinWhere)
        {
            DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
            String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

            String StrCampoRetornado = "";
            try//FJRF - Nos aseguramos que el proceso que se va a ejecutar no tenga error alguno
            {
                if (StrNombreConElCualQuiereQueRetorneElCampo == "")//FJRF - Si el campo a buscar no tiene un alias hacemos lo siguiente
                {
                    StrNombreConElCualQuiereQueRetorneElCampo = StrNombreCampoABuscar;//FJRF - Le asignamos el mismo nombre del campo a buscar
                }
                if (StrCondicionDeBusquedaSinWhere == "")//Si no tiene una condicion hacemos lo siguiente
                {
                    StrConsulta = "SELECT " + StrNombreCampoABuscar + " AS " + StrNombreConElCualQuiereQueRetorneElCampo + " ";//FJRF - Armamos el campo a buscar
                    StrConsulta = StrConsulta + "FROM " + StrNombreDeLaTablaDondeSeDebeBuscar + " ";//FJRF - Le decimos en que tabla buscar
                }
                else//FJRF - Si tiene una condicion hacemos lo siguiente
                {
                    StrConsulta = "SELECT " + StrNombreCampoABuscar + " AS " + StrNombreConElCualQuiereQueRetorneElCampo + " ";//FJRF - Armamos el campo a buscar
                    StrConsulta = StrConsulta + "FROM " + StrNombreDeLaTablaDondeSeDebeBuscar + " ";//FJRF - Le decimos en que tabla buscar
                    StrConsulta = StrConsulta + "WHERE " + StrCondicionDeBusquedaSinWhere + " ";//FJRF - Le decimos bajo que condiciones buscar
                }

                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                DtConsulta = consulta(StrConsulta.ToUpper());//FJRF - Cargamos la consulta con los datos encontrados

                if (DtConsulta.Rows.Count > 0)//FJRF - Si hay datos hacemos lo siguiente
                {
                    StrCampoRetornado = DtConsulta.Rows[0][0].ToString();//Retornamos el dato buscado (Se supone que estamos buscando un solo dato)
                }
                else//FJRF - Si no hay datos hacemos lo siguiente
                {
                    StrCampoRetornado = "DATO NO ENCONTRADO";//FJRF - Informamos que no se encontro el dato buscado
                }
                return StrCampoRetornado;//FJRF - Retornamos el valor solicitado en la consulta del usuario
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                StrCampoRetornado = "ERROR: [" + ex.Message + "] ";//FJRF - Capturamos el mensaje a mostrar
                return StrCampoRetornado;//FJRF - Retornamos el error
            }
        }
        public String PasarCadenaYRetornarCodigoONombre(string strCadena, string strDelimitador, string StrRetornarCodigoONombre)
        {
            try
            {
                String StrRetorno = "";

                if (String.IsNullOrEmpty(strCadena) == true)
                {
                    StrRetorno = "";
                }
                else
                {
                    string strDatoRetornado = strCadena.Trim();
                    string strCodigo, strNombre;
                    int intDelimiterIndx = strDatoRetornado.IndexOf(strDelimitador);
                    int intDelimiterLength = strDelimitador.Length;
                    strCodigo = strDatoRetornado.Substring(0, intDelimiterIndx);
                    strNombre = strDatoRetornado.Substring(intDelimiterIndx + intDelimiterLength, strDatoRetornado.Length - (intDelimiterIndx + intDelimiterLength));

                    if (StrRetornarCodigoONombre.ToUpper().Trim() == "CODIGO")
                    {
                        StrRetorno = strCodigo;
                    }
                    else if (StrRetornarCodigoONombre.ToUpper().Trim() == "NOMBRE")
                    {
                        StrRetorno = strNombre;
                    }
                    else
                    {
                        StrRetorno = "";
                    }
                }
                return StrRetorno;
            }
            catch (Exception Ex)
            {
                return strCadena;//FJRF - Si se presenta algun error devolvemos la cadena tal y como llego
            }
        }
        #endregion

        //Ejecuta comandos Insert,Delete,Update
        public int comando(string query)
        {
            if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
            {
                MDOgeneral.conectar();
            }
            OracleCommand comando = new OracleCommand(query, conexion);
            int f;
            try
            {
                f = comando.ExecuteNonQuery();
            }
            catch (Exception ex){throw (ex);}
            return f;
        }

        public int comandoBogota(string query)
        {
            if (MDOgeneral.ConexionBogota == null || MDOgeneral.ConexionBogota.State == ConnectionState.Closed)
            {
                MDOgeneral.ConectarBogota();
            }
            OracleCommand comando = new OracleCommand(query, conexion);
            int f;
            try
            {
                f = comando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw (ex); }
            return f;
        }

        #endregion

        #region informacion de usuario
            public static string usuario="CECT01";
            public static string Fotos_BOSI = @"U:\";
            public static string Fotos_ARTESA = @"C:\SIA\IMAGENES\";
        #endregion

        #region mostrar notificacion mensaje momentane

        public class notificar
        {
            public WrapPanel wp;
            public static System.ComponentModel.BackgroundWorker s = new System.ComponentModel.BackgroundWorker();
            public notificar(WrapPanel _Wp, string _value, Boolean tipo)
            {

                wp = _Wp;
                construir(_value, tipo);

                if (s.IsBusy)
                {
                    s.CancelAsync();
                }
                else
                {
                    crear();
                    s.RunWorkerAsync();
                }
            }
            private void s_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                System.Threading.Thread.Sleep(10000);
                if (s.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
            private void s_RunWorkerCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                if (e.Cancelled)
                {
                    crear();
                    s.RunWorkerAsync();
                }
                else {
                     
                    wp.Children.Clear();
                }                 
            }
            private void crear() 
            {
                s = new System.ComponentModel.BackgroundWorker();
                s.DoWork += new System.ComponentModel.DoWorkEventHandler(s_DoWork);
                s.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(s_RunWorkerCompleted);
                s.WorkerSupportsCancellation = true;
            }
            private void construir(string value, Boolean tipo)
            {
                TextBlock text = new TextBlock();
                Image img = new Image();
                wp.Children.Clear();

                img.Height = 25;
                img.Width = 25;
                img.VerticalAlignment = System.Windows.VerticalAlignment.Top;
                img.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
                text.TextWrapping = System.Windows.TextWrapping.Wrap;
                text.Text = value;
               
                text.VerticalAlignment = System.Windows.VerticalAlignment.Stretch;
                text.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
                text.FontWeight = System.Windows.FontWeights.UltraBold;
                text.Margin = new System.Windows.Thickness(4, 0, 0, 4);
                System.Windows.Media.BrushConverter bc = new System.Windows.Media.BrushConverter();
               
                wp.Children.Add(img);
                wp.Children.Add(text);
                System.Windows.Media.Imaging.BitmapImage bi = new System.Windows.Media.Imaging.BitmapImage();

                if (tipo)
                {
                    bi.BeginInit();
                    bi.UriSource = new Uri("/produccion;component/Images/ok.png", UriKind.Relative);
                    bi.EndInit();
                    img.Source = bi;
                    text.Foreground = System.Windows.Media.Brushes.Green;
                }
                else
                {
                    bi.BeginInit();
                    bi.UriSource = new Uri("/produccion;component/Images/no.png", UriKind.Relative);
                    bi.EndInit();
                    img.Source = bi;
                    text.Foreground = System.Windows.Media.Brushes.Red;

                    System.Media.SoundPlayer player = new System.Media.SoundPlayer();
                    player.Stream = Properties.Resources.error;
                    player.Play();
                }

            }
        }
        #endregion

        #region metodo para validar campos

        public static string validar(string tipo, string valor, string maxc, string minc, string maxv, string minv, string posd)
        {
            //tipo (Tipo de dato): url|email|tel|entero|decimal|cadena
            //valor: Texto ingresado por el usuario
            //maxc:  Tamaño maximo del texto
            //minc:  Tamaño minimo del texto
            //maxv:  Valor maximo para tipo: entero|decimal
            //minv:  Valor minimo para tipo: entero|decimal
            //posd:  Numero de digitos posibles antes de coma tipo: decimal
            //pred:  Numero de digitos posibles despues de coma tipo: decimal

            //Ejemplo email  validar("email", variable, "40", "1", "*", "*","*");
            //Ejemplo url validar("url", variable, "40", "1", "*", "*","*");
            //Ejemplo tel validar("tel", variable, "10", "1", "*", "*", "*");
            //Ejemplo entero validar("entero", variable, "10", "1", "*", "*", "*");
            //Ejemplo decimal validar("decimal", variable, "11", "1", "*", "*", "8");
            //Ejemplo cadena validar("cadena", variable, "10", "1", "*", "*");

            if (valor.Length == 0 && minc != "0")
            {
                return ("El campo no puede estar vacio");
            }
            if (valor.Length == 0 && minc == "0")
            {
                return "";
            }
            string patron;
            switch (tipo)
            {
                case ("url"):
                    patron = @"^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$";
                    if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
                    {
                        return ("Direccion no valida eje: http://ejemplo.com");
                    }
                    break;
                case ("email"):
                    patron = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
                    if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
                    {
                        return ("Correo no valido eje: ejemplo@mybosi.com");
                    }
                    break;
                case ("tel"):
                    patron = @"^([1-9]\d{9})$|^([1-9]\d{6})$";
                    if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
                    {
                        return ("Telefono no valido eje: 4444123 3004444123");
                    }
                    break;
                case ("entero"):
                    patron = @"^((\+{0,1}|-{0,1})\d+)$";
                    if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
                    {
                        return ("El valor debe ser un numero entero eje: 55");
                    }
                    else
                    {
                        if (minv != "*")
                        {
                            if (int.Parse(valor) < int.Parse(minv))
                            {
                                return ("El valor debe ser igual o mayor a: " + minv);
                            }
                        }
                        if (maxv != "*")
                        {
                            if (int.Parse(valor) > int.Parse(maxv))
                            {
                                return ("El valor debe ser igual o menor a: " + maxv);
                            }
                        }
                    }
                    break;
                case ("decimal"):
                    patron = @"^((\+{0,1}|-{0,1})\d+(\.|,){0,1}\d*)$";
                    if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
                    {
                        return ("El valor debe ser numero decimal eje: 1000.8");
                    }
                    else
                    {
                        if (minv != "*")
                        {
                            if (double.Parse(valor.Replace(".", ",")) < double.Parse(minv.Replace(".", ",")))
                            {
                                return ("El valor debe ser igual o mayor a: " + minv);
                            }
                        }
                        if (maxv != "*")
                        {
                            if (double.Parse(valor.Replace(".", ",")) > double.Parse(maxv.Replace(".", ",")))
                            {
                                return ("El valor debe ser igual o menor a: " + maxv);
                            }
                        }

                        if (posd != "*")
                        {
                            if (valor.Replace(".", ",").Split(',')[0].Length > int.Parse(posd))
                            {
                                return ("Antes de punto solo puede haber " + posd + " digitos");
                            }
                        }
                    }
                    break;
            }

            if (valor.Length < int.Parse(minc))
            {
                return ("El valor debe tener minimo " + minc + " caracteres");
            }
            if (valor.Length > int.Parse(maxc))
            {
                return ("El valor debe tener maximo " + maxc + " caracteres");
            }
            
            return "";
        }
        #endregion

        public DataTable MP_FiltrarDataTable(DataTable poDataTable, string psFiltro, string psOrder)
        {
            DataRow[] loRows;
            DataTable loNuevoDataTable;

            // Copio la estructura del DataTable original
            loNuevoDataTable = poDataTable.Clone();

            // Establezco el filtro y el orden
            if (psOrder.Equals(""))
            {
                loRows = poDataTable.Select(psFiltro);
            }
            else
            {
                loRows = poDataTable.Select(psFiltro, psOrder);
            }

            // Cargo el nuevo DataTable con los datos filtrados
            foreach (DataRow ldrRow in loRows)
            {
                loNuevoDataTable.ImportRow(ldrRow);
            }

            // Retorno el nuevo DataTable
            return loNuevoDataTable;
        }

        public void EnviarCorreo(string Destino, string Asunto, string Contenido, string Ruta1, string Ruta2, string Ruta3)
        {
            try
            {
                MailMessage objMail;
                objMail = new MailMessage();
                objMail.From = new MailAddress(produccion.Properties.Settings.Default.Email); //Remitente
                objMail.To.Add(Destino); //Email a enviar 
                objMail.Subject = Asunto;
                objMail.Body = Contenido;
                objMail.IsBodyHtml = true;
                if (Ruta1 != "")
                {
                    objMail.Attachments.Add(new Attachment(Ruta1));
                }
                if (Ruta2 != "")
                {
                    objMail.Attachments.Add(new Attachment(Ruta2));
                }
                if (Ruta3 != "")
                {
                    objMail.Attachments.Add(new Attachment(Ruta3));
                }
                SmtpClient SmtpMail = new SmtpClient();
                SmtpMail.Host = produccion.Properties.Settings.Default.ServidorSMTP; //el nombre del servidor de correo
                SmtpMail.Port = System.Convert.ToInt16(produccion.Properties.Settings.Default.PuertoSMTP);
                SmtpMail.Credentials = new System.Net.NetworkCredential(produccion.Properties.Settings.Default.Email, produccion.Properties.Settings.Default.Contraseña);
                SmtpMail.Send(objMail); //Enviamos el correo
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        static string encriptar(string cadena)
        {
            string clave = "Q234FSLHBWSP9E5S@IKWSOSEIOERLPOQ";
            // Convierto la cadena y la clave en arreglos de bytes
            // para poder usarlas en las funciones de encriptacion
            byte[] cadenaBytes = Encoding.UTF8.GetBytes(cadena);
            byte[] claveBytes = Encoding.UTF8.GetBytes(clave);

            // Creo un objeto de la clase Rijndael
            RijndaelManaged rij = new RijndaelManaged();

            // Configuro para que utilice el modo ECB
            rij.Mode = CipherMode.ECB;

            // Configuro para que use encriptacion de 256 bits.
            rij.BlockSize = 256;

            // Declaro que si necesitara mas bytes agregue ceros.
            rij.Padding = PaddingMode.Zeros;

            // Declaro un encriptador que use mi clave secreta y un vector
            // de inicializacion aleatorio
            ICryptoTransform encriptador;
            encriptador = rij.CreateEncryptor(claveBytes, rij.IV);

            // Declaro un stream de memoria para que guarde los datos
            // encriptados a medida que se van calculando
            MemoryStream memStream = new MemoryStream();

            // Declaro un stream de cifrado para que pueda escribir aqui
            // la cadena a encriptar. Esta clase utiliza el encriptador
            // y el stream de memoria para realizar la encriptacion
            // y para almacenarla
            CryptoStream cifradoStream;
            cifradoStream = new CryptoStream(memStream, encriptador, CryptoStreamMode.Write);

            // Escribo los bytes a encriptar. A medida que se va escribiendo
            // se va encriptando la cadena
            cifradoStream.Write(cadenaBytes, 0, cadenaBytes.Length);

            // Aviso que la encriptación se terminó
            cifradoStream.FlushFinalBlock();

            // Convert our encrypted data from a memory stream into a byte array.
            byte[] cipherTextBytes = memStream.ToArray();

            // Cierro los dos streams creados
            memStream.Close();
            cifradoStream.Close();

            // Convierto el resultado en base 64 para que sea legible
            // y devuelvo el resultado
            return Convert.ToBase64String(cipherTextBytes);
        }

        static string desencriptar(string cadena)
        {
            string clave = "Q234FSLHBWSP9E5S@IKWSOSEIOERLPOQ";
            // Convierto la cadena y la clave en arreglos de bytes
            // para poder usarlas en las funciones de encriptacion
            // En este caso la cadena la convierta usando base 64
            // que es la codificacion usada en el metodo encriptar
            byte[] cadenaBytes = Convert.FromBase64String(cadena);
            byte[] claveBytes = Encoding.UTF8.GetBytes(clave);

            // Creo un objeto de la clase Rijndael
            RijndaelManaged rij = new RijndaelManaged();

            // Configuro para que utilice el modo ECB
            rij.Mode = CipherMode.ECB;

            // Configuro para que use encriptacion de 256 bits.
            rij.BlockSize = 256;

            // Declaro que si necesitara mas bytes agregue ceros.
            rij.Padding = PaddingMode.Zeros;

            // Declaro un desencriptador que use mi clave secreta y un vector
            // de inicializacion aleatorio
            ICryptoTransform desencriptador;
            desencriptador = rij.CreateDecryptor(claveBytes, rij.IV);

            // Declaro un stream de memoria para que guarde los datos
            // encriptados
            MemoryStream memStream = new MemoryStream(cadenaBytes);

            // Declaro un stream de cifrado para que pueda leer de aqui
            // la cadena a desencriptar. Esta clase utiliza el desencriptador
            // y el stream de memoria para realizar la desencriptacion
            CryptoStream cifradoStream;
            cifradoStream = new CryptoStream(memStream, desencriptador, CryptoStreamMode.Read);

            // Declaro un lector para que lea desde el stream de cifrado.
            // A medida que vaya leyendo se ira desencriptando.
            StreamReader lectorStream = new StreamReader(cifradoStream);

            // Leo todos los bytes y lo almaceno en una cadena
            string resultado = lectorStream.ReadToEnd().Replace("\0", "");

            // Cierro los dos streams creados
            memStream.Close();
            cifradoStream.Close();

            // Devuelvo la cadena
            return resultado;
        }

        public class mensaje : ObservableObject
        {
            public static System.ComponentModel.BackgroundWorker s = new System.ComponentModel.BackgroundWorker();
            public mensaje() {
                s = new System.ComponentModel.BackgroundWorker();
                s.DoWork += new System.ComponentModel.DoWorkEventHandler(s_DoWork);
                s.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(s_RunWorkerCompleted);
                s.WorkerSupportsCancellation = true;
      
            }    

            private void s_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {

                System.Threading.Thread.Sleep(5000);
       
                if (s.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
            private void s_RunWorkerCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                if (e.Cancelled)
                {
                    s.RunWorkerAsync();
                }
                else
                {

        
                    texto = "";
            
                }
            }

            private string aux="";

            private string _texto;
            public string texto
            {
                get { return _texto; }
                set
                {
                    _texto = value;

                    if (!String.IsNullOrEmpty(_texto)&&!_texto.Equals(aux)) {
             
                        if (s.IsBusy)
                        {
                            s.CancelAsync();
                        }
                        else
                        {
                   
                            s.RunWorkerAsync();
                        }            
                    }

                    RaisePropertyChangedEvent("texto");
                }
            }

            private Brush _color = Brushes.Green;
            public Brush color
            {
                get { return _color; }
                set
                {
                    _color = value;
                    RaisePropertyChangedEvent("color");
                }
            }

            private Boolean _tipo = true;
            public Boolean tipo
            {
                get { return _tipo; }
                set
                {
                    _tipo = value;
                    color = _tipo == true ? Brushes.Green : Brushes.Red;
                    RaisePropertyChangedEvent("tipo");
                }
            }

        }

        static string cnxFto="-";

        //Consulta de fotos para referencia 
        public static BitmapImage conFoto(string codref, string codcol)
        {
            try 
            {
                //Verificar conexion a Carpeta Remota antes de probar
                if (cnxFto.Equals("-")) {
                    if (Directory.Exists(MDOgeneral.Fotos_BOSI))
                    {
                        cnxFto = "S";
                    }
                    else {
                        cnxFto = "N";
                    }
                }
        
                BitmapImage img = new BitmapImage();
                img.BeginInit();
    
      
                if (cnxFto.Equals("S")) 
                {
        
                    //Foto para el color
                    if (!String.IsNullOrEmpty(codcol)) {
                        if (File.Exists(MDOgeneral.Fotos_BOSI + codref + codcol + ".jpg"))
                        {
                            img.UriSource = new Uri(MDOgeneral.Fotos_BOSI + codref + codcol + ".jpg");
                            img.EndInit();
                            return img;
                        }
                    }
          
                    //Foto sin color
                    if (File.Exists(MDOgeneral.Fotos_BOSI + codref + ".jpg"))
                    {
                        img.UriSource = new Uri(MDOgeneral.Fotos_BOSI + codref + ".jpg");
                        img.EndInit();
                        return img;
                    }

                    //Foto para cualquier color-Consultar colores para referencia
                    clases.CLSMAEPRO mae = new clases.CLSMAEPRO {CODREF_PRO=codref };
                    DataTable  val=mae.BuscarColor();
                    foreach (DataRow r in val.Rows) {
                        if (!String.IsNullOrEmpty(r["Codigo"].ToString()))
                        {
                            if (File.Exists(MDOgeneral.Fotos_BOSI + codref + r["Codigo"].ToString()+".jpg"))
                            {

                                img.UriSource = new Uri(MDOgeneral.Fotos_BOSI + codref + r["Codigo"].ToString() + ".jpg");
                                img.EndInit();
                                return img;
                            }
                        }
                    }

                }
                return null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); return null; }
        }

        #region seguridad
                public static Boolean EstLogIn = false;
        #endregion

    }

        public static class toolsUtiles
        {
            public static DataTable ToDataTable<T>(this IList<T> data)
            {
                PropertyDescriptorCollection props =
                    TypeDescriptor.GetProperties(typeof(T));
                DataTable table = new DataTable();
                for (int i = 0; i < props.Count; i++)
                {
                    PropertyDescriptor prop = props[i];
                    table.Columns.Add(prop.Name, prop.PropertyType);
                }
                object[] values = new object[props.Count];
                foreach (T item in data)
                {
                    for (int i = 0; i < values.Length; i++)
                    {
                        values[i] = props[i].GetValue(item);
                    }
                    table.Rows.Add(values);
                }
                return table;
            }
        }

}

namespace ReglasValidacion
{
    #region generales
    public class esOKurl : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            string patron = @"^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)( [a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "Direccion no valida eje: http://ejemplo.com.");
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKmail : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            string patron = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "Correo no valido eje: ejemplo@mybosi.com.");
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKtelefono : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            string patron = @"^([1-9]\d{9})$|^([1-9]\d{6,7})$";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "Telefono no valido eje: 4444123 3004444123");
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKcadena : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {

            string valor = value==null?"":(string)value;

            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            //Para garantizar que no ingresen un numero  --Jovanny Restrepo
            //if (valor.Length>7)
            //{
            //    try 
            //    { 
            //        if (Convert.ToInt64(valor)>1)
            //            return new ValidationResult(false, "El dato ingresado no es una cadena.");
            //    }
            //    catch { }
            //}
            return new ValidationResult(true, null);
        }
    }

    public class esOKEan13 : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {

            string valor = value == null ? "" : (string)value;

            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            if (valor.Length != 13)
                return new ValidationResult(false, "El dato ingresado no es un codigo de barras.");

            if (valor.Substring(0, 3) != "770")
                return new ValidationResult(false, "El dato ingresado no es un codigo de barras.");

            //Para garantizar que si es un codigo de barras  --Jovanny Restrepo
            if (valor.Length == 13)
            {
                try
                {
                    if (Convert.ToInt64(valor) < 1)
                        return new ValidationResult(false, "El dato ingresado no es un codigo de barras.");
                }
                catch { }
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKdecimal : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }
        public string Minv { get; set; }
        public string Maxv { get; set; }
        public string Posd { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            //string patron = @"^((\+{0,1}|-{0,1})\d+(\.|,){0,1}\d*)$";
            string patron = @"^\d{1,10}(\.\d{0,2})?$";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "Error en el número de decimales");
            }
            else
            {
                //if (Minv != "*")
                //{
                //    if (double.Parse(valor.Replace(".", ",")) < double.Parse(Minv.Replace(".", ",")))
                //    {
                //        return new ValidationResult(false, "El valor debe ser igual o mayor a: " + Minv);
                //    }
                //}
                //if (Maxv != "*")
                //{
                //    if (double.Parse(valor.Replace(".", ",")) > double.Parse(Maxv.Replace(".", ",")))
                //    {
                //        return new ValidationResult(false, "El valor debe ser igual o menor a: " + Maxv);
                //    }
                //}
                //if (Posd != "*")
                //{
                //    if (valor.Replace(".", ",").Split(',')[0].Length > int.Parse(Posd))
                //    {
                //        return new ValidationResult(false, "Antes de punto solo puede haber " + Posd + " digitos.");
                //    }
                //}
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKentero : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }
        public string Minv { get; set; }
        public string Maxv { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = System.Convert.ToString(value);
            if (valor.Length>3)
                valor = valor.Replace(",", "");

            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            string patron = @"^(\-\d{1,10}$)|^(\d{1,10}$)";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "El valor debe ser un numero entero eje: 55");
            }
            else
            {
                if (Minv != "*")
                {
                    if (Convert.ToInt64(value) < int.Parse(Minv))
                    {
                        return new ValidationResult(false, "El valor debe ser igual o mayor a: " + Minv);
                    }
                }
                if (Maxv != "*")
                {
                    if (Convert.ToInt64(value) > int.Parse(Maxv))
                    {
                        return new ValidationResult(false, "El valor debe ser igual o menor a: " + Maxv);
                    }
                }
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKiac : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            if (valor.Length == 7)
            {
                string cadena = valor.Substring(0, 3);
                if (!(cadena.Equals("770")))
                {
                    return new ValidationResult(false, "Los caracteres iniciales del valor IAC deben ser 770.");
                }
            }
            else
            {
                return new ValidationResult(false, "El codigo IAC debe tener una longitud de 7 caracteres.");
            }

            return new ValidationResult(true, null);
        }
    }

    public class esOKfecha : ValidationRule
    {
        public int Minc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value == null && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (value == null && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKNoduplicados : ValidationRule
    {
        public string valMet { get; set; }
        public string valMetlis { get; set; }
        public DataGrid obj { get; set; }
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value!=null)
            {
            Boolean res = false;
            object Lista = obj.ItemsSource;
            object Objeto = obj.SelectedItem;
            if (Objeto == null) {
                return new ValidationResult(true, null);
            }
            PropertyInfo magicPro = Objeto.GetType().GetProperty("EXISTE");
            Boolean EXISTE=(Boolean) magicPro.GetValue(Objeto, new object[] { });
            magicPro = Objeto.GetType().GetProperty("ELIMINAR");
            Boolean ELIMINAR= (Boolean)magicPro.GetValue(Objeto, new object[] { });

            if (!EXISTE && !ELIMINAR)
            {

                MethodInfo magicMethod = Objeto.GetType().GetMethod(valMetlis);
                object resultado = magicMethod.Invoke(Objeto, new object[] { Lista, Objeto });
                res = (Boolean)resultado;
                if (res)
                {
                    return new ValidationResult(false, "El elemento que desea crear ya existe.");
                }
                res = false;
                magicMethod = Objeto.GetType().GetMethod(valMet);
                resultado = magicMethod.Invoke(Objeto, new object[] { });
                res = (Boolean)resultado;
                if (res)
                {
                    return new ValidationResult(false, "El elemento que desea crear ya existe.");
                }

            }
            }

            return new ValidationResult(true,null);
        }

    }

    public class esOKdouble : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }
        public string Minv { get; set; }
        public string Maxv { get; set; }
        public string Posd { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value == "")
            {
                value = 0;
            }
            double valor =System.Convert.ToDouble(value);
            if (valor.ToString().Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.ToString().Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.ToString().Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.ToString().Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }

            if (Minv != "*")
            {
                if (valor < double.Parse(Minv.Replace(".", ",")))
                {
                    return new ValidationResult(false, "El valor debe ser igual o mayor a: " + Minv);
                }
            }
            if (Maxv != "*")
            {
                if (valor > double.Parse(Maxv.Replace(".", ",")))
                {
                    return new ValidationResult(false, "El valor debe ser igual o menor a: " + Maxv);
                }
            }
            if (Posd != "*")
            {
                if (valor.ToString().Replace(".", ",").Split(',')[0].Length > int.Parse(Posd))
                {
                    return new ValidationResult(false, "Antes de punto solo puede haber " + Posd + " digitos.");
                }
            }

            return new ValidationResult(true, null);
        }
    }

    public class esOKdatatime : ValidationRule
    {
        public int Minc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            if (value == null && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (value == null && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            return new ValidationResult(true, null);
        }
    }

    public class esOKNit : ValidationRule
    {
        public int Minc { get; set; }
        public int Maxc { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            string valor = (string)value;
            if (valor.Length == 0 && Minc != 0)
            {
                return new ValidationResult(false, "El campo no puede estar vacio.");
            }
            if (valor.Length == 0 && Minc == 0)
            {
                return new ValidationResult(true, null);
            }
            if (valor.Length < Minc)
            {
                return new ValidationResult(false, "El campo debe tener minimo " + Minc + " caracteres.");
            }
            if (valor.Length > Maxc)
            {
                return new ValidationResult(false, "El campo debe tener maximo " + Maxc + " caracteres.");
            }
            string patron = @"^(\d{8,11}\-\d{1})$|^(\d{6,12})$";
            if (!System.Text.RegularExpressions.Regex.IsMatch(valor, patron))
            {
                return new ValidationResult(false, "Nit no valido eje: 890323654-4");
            }
            return new ValidationResult(true, null);
        }
    }
        
    //validar grupo-Subgrupo
    public class esOKSubGrupo : ValidationRule
    {
        public produccion.forms.mangrups mangrups { get; set; }  

        public override ValidationResult Validate(object value,CultureInfo cultureInfo)
        {
                ValidationResult res;

                if (mangrups.Subg.CODSUB_SUB== null)
                {
                    if (mangrups.Subg.NOMSUB_SUB != null && mangrups.Subg.NOMSUB_SUB != "" && !mangrups.Subg.ELIMINAR)
                    {
                        return new ValidationResult(false, "El codigo del subgrupo no puede estar vacio.");
                    }
                    return new ValidationResult(true, null);
                }
           
            if (mangrups.Subg.CODSUB_SUB.Equals(""))
                {
                    if (mangrups.Subg.NOMSUB_SUB != null && mangrups.Subg.NOMSUB_SUB != "" && !mangrups.Subg.ELIMINAR)
                    {
                        return new ValidationResult(false, "El codigo del subgrupo no puede estar vacio.");
                    }
                    return new ValidationResult(true, null);
                }

            if (!mangrups.Subg.ELIMINAR)
            {
                if (!mangrups.Subg.EXISTE)
                {
                    res = new esOKcadena { Maxc = 2, Minc = 1 }.Validate(mangrups.Subg.CODSUB_SUB, cultureInfo);
                    if (!res.IsValid)
                    {
                        return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo", "codigo"));
                    }

                    if (mangrups.Subg.existe())
                    {
                        return new ValidationResult(false, "El subgrupo ingresado ya existe.");
                    }
                    else
                    {
                        if (mangrups.lisSubg.FindAll(r => r.CODSUB_SUB != null).FindAll(r => r.CODSUB_SUB.Equals(mangrups.Subg.CODSUB_SUB)).Count > 1)
                        {
                            return new ValidationResult(false, "El subgrupo ingresado ya existe.");
                        }
                    }
                }

                res = new esOKcadena { Maxc = 40, Minc = 1 }.Validate(mangrups.Subg.NOMSUB_SUB, cultureInfo);
                if (!res.IsValid)
                {
                    return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo", "nombre"));
                }

            }
            else {

                if (mangrups.Subg.exiMov())
                {
                    return new ValidationResult(false, "El subgrupo no puede ser eliminado, tiene movimientos.");
                }
            }
            return new ValidationResult(true, null);
        }
    }

    //Validar material-(materia prima) 
    public class esOKMateriap : ValidationRule
    {
        public DataGrid grid{get;set;}

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.clases.CLSMAEMTP matp = (value as BindingGroup).Items[0] as produccion.clases.CLSMAEMTP;
            List<produccion.clases.CLSMAEMTP> lmatp=(List<produccion.clases.CLSMAEMTP>)grid.ItemsSource;
            ValidationResult res;

            if (matp.CODCOL_MTP==null)
            {
                if (matp.CODBAR_MTP != null && matp.CODBAR_MTP != "" && !matp.ELIMINAR)
                {
                    return new ValidationResult(false,"El codigo del color no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }
            if (matp.CODCOL_MTP.Equals(""))
            {
                if (matp.CODBAR_MTP != null && matp.CODBAR_MTP != "" && !matp.ELIMINAR)
                {
                    return new ValidationResult(false, "El codigo del color no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }
            if (!matp.ELIMINAR)
            {
                
                if(!matp.EXISTE)
                {
                    res = new esOKcadena { Maxc = 4, Minc = 4 }.Validate(matp.CODCOL_MTP, cultureInfo);
                    if (!res.IsValid)
                    {
                        return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo", "Codigo del color"));
                    } 

                    if (!new produccion.clases.CLSMAECOLP { CODCOL_COL = matp.CODCOL_MTP }.existe())
                    {
                            return new ValidationResult(false, "El color ingresado no existe.");
                    }

                    if (matp.existe())
                    {
                        return new ValidationResult(false, "El color ingresado ya existe.");
                    }
                    else
                    {
                        if (lmatp.FindAll(r => r.CODCOL_MTP!=null).FindAll(r => r.CODCOL_MTP.Equals(matp.CODCOL_MTP)).Count > 1)
                        {
                            return new ValidationResult(false, "El color ingresado ya existe.");
                        }
                    }
                }

                //res = new esOKcadena { Maxc = 20, Minc = 1 }.Validate(matp.CODBAR_MTP, cultureInfo);
                //if (!res.IsValid)
                //{
                //    return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo", "Codigo de barras"));
                //}

            }
            else 
            {
                if (matp.tieneExistencia()) 
                {
                    return new ValidationResult(false, "La materia prima no se puede eliminar, tiene existencia.");
                }
            }
            return new ValidationResult(true, null);
        }
    }

    //Validar material-(proveedor) 
    public class esOKPromat : ValidationRule
    {
        public DataGrid grid { get; set; }

        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {

            produccion.clases.CLSPRVMAT promat = (value as BindingGroup).Items[0] as produccion.clases.CLSPRVMAT;
            List<produccion.clases.CLSPRVMAT> lpromat = (List<produccion.clases.CLSPRVMAT>)grid.ItemsSource; 
            ValidationResult res;

            if (promat.CODPRV_PXM==null)
            {
                if (promat.COSTO_PXM != 0 && !promat.ELIMINAR)
                {
                    return new ValidationResult(false, "El codigo del proveedor no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }
            if (promat.CODPRV_PXM.Equals(""))
            {
                if (promat.COSTO_PXM != 0 && !promat.ELIMINAR)
                {
                    return new ValidationResult(false, "El codigo del proveedor no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }

            if (!promat.ELIMINAR)
            {
                if (!promat.EXISTE)
                {
                    res = new esOKcadena { Maxc = 3, Minc = 3 }.Validate(promat.CODPRV_PXM, cultureInfo);
                    if (!res.IsValid)
                    {
                        return new ValidationResult(false,res.ErrorContent.ToString().Replace("campo","Codigo proveedor"));
                    }

                    if (!new produccion.clases.CLSMAEPRVP { CODPRV_PRV = promat.CODPRV_PXM }.existe())
                    {
                        return new ValidationResult(false, "El proveedor ingresado no existe.");
                    }

                    if (promat.existe())
                    {
                        return new ValidationResult(false, "El proveedor ingresado ya existe.");
                    }
                    else
                    {
                        if (lpromat.FindAll(r => r.CODPRV_PXM.Equals(promat.CODPRV_PXM)).Count > 1)
                        {
                            return new ValidationResult(false, "El proveedor ingresado ya existe.");
                        }
                    }
                }
                res = new esOKentero { Maxc = 10, Minc = 1, Minv = "0", Maxv = "*" }.Validate(promat.COSTO_PXM, cultureInfo);
                if (!res.IsValid)
                {
                    return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo","Costo"));
                }
            }
            else{
             
                if (promat.exiMov()) {
                    return new ValidationResult(false, "El proveedor no puede ser eliminado, tiene movimientos.");
                }
            }

            return new ValidationResult(true, null);
        }
    }

    //Validar Entrada de materia prima 
    public class esOKEntMatp : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.entMatPr.MateriaPrima matp = (value as BindingGroup).Items[0] as produccion.forms.entMatPr.MateriaPrima;
            ValidationResult res;

            if (matp.codigo == null)
            {
                if (matp.cantidad != 0)
                {
                    return new ValidationResult(false, "El codigo de la materia prima no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }
            if (matp.codigo.Equals(""))
            {
                if (matp.cantidad != 0)
                {
                    return new ValidationResult(false, "El codigo de la materia prima no puede estar vacio.");
                }
                return new ValidationResult(true, null);
            }
            
            res = new esOKcadena { Maxc = 10, Minc = 10 }.Validate(matp.codigo, cultureInfo);
            if (!res.IsValid)
            {
                return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo", "Codigo materia prima"));
            }
            
            if (!new produccion.clases.CLSMAEMTP { CODMAT_MTP = matp.codigo.Substring(0, 6), CODCOL_MTP = matp.codigo.Substring(6, 4) }.existe())
            {
                return new ValidationResult(false, "La materia prima ingresada no existe.");
            }

            res = new esOKdouble { Maxc = 12, Minc = 1, Minv = "1", Maxv = "*", Posd = "9" }.Validate(matp.cantidad, cultureInfo);
            if (!res.IsValid)
            {
                return new ValidationResult(false, res.ErrorContent.ToString().Replace("campo","cantidad"));
            }

            return new ValidationResult(true, null);
        }

    }


    //Validar Hoja de entrada materia prima
    public class esOKHojMat : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.entMatPr entMatPr = produccion.forms.entMatPr.Instance;

            if (value != null && entMatPr.EncEnMatp.HOJNRO_EEN.Length == 7)
            {

                string campo = entMatPr.EncEnMatp.HOJNRO_EEN;
                string tipo =entMatPr.EncEnMatp.TIPENT_EEN;
                produccion.clases.CLSENCENT encabezado = new produccion.clases.CLSENCENT();
                encabezado.TIPENT_EEN = tipo;
                encabezado.HOJNRO_EEN = campo;
                if (encabezado.existe() == false)
                {
                    produccion.clases.CLSCONTROLP valor = new produccion.clases.CLSCONTROLP();
                    valor.ID_CON = "ENT";
                    if (tipo.ToString().Equals("N"))
                    {
                        valor.COD_CON = "NOR";
                    }
                    else
                    {
                        valor.COD_CON = "DEV";
                    }
                    valor.Consultar();


                    if (!valor.NOM_CON.Equals(campo))
                    {
                        return new ValidationResult(false, "La hoja ingresada no existe");
                    }
                }
                else 
                {
                    return new ValidationResult(false, "La hoja ingresada no existe");
                }

            }
            else 
            {
                return new ValidationResult(false, "La hoja ingresada no existe");
            }
     

            return new ValidationResult(true, null);
        }
    }

    #endregion
}

namespace ReglasFormato
{
    [ValueConversion(typeof(String), typeof(String))]
    public class FormatoCadena : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                string dato = System.Convert.ToString(value);
                dato = dato.Replace("'", "");
                return dato;
            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                string dato = System.Convert.ToString(value); 
                dato = dato.Replace("'", "");
                return dato;
            }
            return DependencyProperty.UnsetValue;
        }
    }

    [ValueConversion(typeof(String), typeof(String))]
    public class FormatoDecimal : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value != DBNull.Value)
            {
                string dato = (string)value;
                dato = dato.Replace(",", ".");
                dato = dato.Replace("'", "");
                return dato;
            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && value != DBNull.Value)
            {
                string dato = (string)value;
                dato = dato.Replace(",", ".");
                dato = dato.Replace("'", "");
                return dato;
            }
            return DependencyProperty.UnsetValue;
        }
    }

    //Convertir a Boleano opuesto
    [ValueConversion(typeof(Boolean), typeof(Boolean))]
    public class convOpuestoBool : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                Boolean dato = (Boolean)value;
                return !dato;

            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                Boolean dato = (Boolean)value;
                return !dato;
            }
            return DependencyProperty.UnsetValue;
        }
    }

    //Si el valor corresponde al parametro: S-N igual S=true N=false
    [ValueConversion(typeof(String), typeof(Boolean))]
    public class convValBool : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null && parameter != null)
            {
                string dato = (string)value;
                string parametro = (string)parameter;
                return dato.Equals(parametro.Split('-')[0]) ? true : false;
            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                Boolean dato = (Boolean)value;
                string parametro = (string)parameter;

                int i=parametro.Split('-').Count();
                return dato == true ? parametro.Split('-')[0] : i == 2 ? parametro.Split('-')[1]: DependencyProperty.UnsetValue;
                
            }
            return DependencyProperty.UnsetValue;
        }
    }

    //Convertir un valor string DataTime 
    [ValueConversion(typeof(String), typeof(DateTime))]
    public class convStrDatet : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                string dato = (string)value;
                if (dato != "")
                {
                    return DateTime.Parse(dato);
                }
            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                DateTime dato = (DateTime)value;
                return dato.ToString("dd-MM-yyyy");
            }
            else
            {
                return "";
            }
        }
    }

    //Convertir un valor DateTime a string
    [ValueConversion(typeof(DateTime), typeof(String))]
    public class convDatimStr : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                DateTime dato = System.Convert.ToDateTime(value);
                if (dato != null)
                {
                    return dato.ToShortDateString();
                }
            }
            return DependencyProperty.UnsetValue;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                
                return System.Convert.ToDateTime(value); 
            }
            else
            {
                return "";
            }
        }
    }
        
    //Convertir un string en Double y evalua Formular
    [ValueConversion(typeof(Double), typeof(String))]
    public class evaluarFormula : IValueConverter
    {
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                if (value != null)
                {
                    string formula = value.ToString();
                    String[] numeros = formula.Split('+', '-');
                    string signos = "";

                    Double numTotal = 0;


                    int x = 0;
                    for (int i = 0; i <= formula.Length - 1; i++)
                    {
                        if (formula[i].Equals('+') || formula[i].Equals('-'))
                        {
                            signos = signos + formula[i];
                        }
                    }

                    x = 0;
                    for (int i = 0; i <= numeros.Length - 1; i++)
                    {
                        if (numTotal == 0)
                            numTotal = System.Convert.ToDouble(numeros[i]);
                        else
                        {
                            if (signos[x].Equals('+'))
                            {
                                numTotal = numTotal + System.Convert.ToDouble(numeros[i]);
                            }
                            if (signos[x].Equals('-'))
                            {
                                numTotal = numTotal - System.Convert.ToDouble(numeros[i]);
                            }
                            x = x + 1;
                        }
                    }

                    return numTotal;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return DependencyProperty.UnsetValue;
        }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {

                return value.ToString();
            }
            else
            {
                return "";
            }
        }
    }
        
    [ValueConversion(typeof(Boolean), typeof(Visibility))]
    public class convBoolVisible : IValueConverter
    {
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                if (value != null)
                {
                    Visibility valor=(Visibility)value;
                    if (valor.Equals(Visibility.Collapsed))
                    {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return DependencyProperty.UnsetValue;
        }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                Boolean valor = System.Convert.ToBoolean(value);
                if (valor) {
                    return Visibility.Collapsed;
                } else {
                    return Visibility.Visible;
                }
            }

            return DependencyProperty.UnsetValue;
      
        }
    }

    [ValueConversion(typeof(Double), typeof(Double))]
    public class convTamGridAutoAjustable : IValueConverter
    {
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                if (value != null)
                {
                    var valor = System.Convert.ToDouble(value);
                    return valor +23;     
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return DependencyProperty.UnsetValue;
        }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                var valor = System.Convert.ToDouble(value);
                return valor - 23;           
            }

            return DependencyProperty.UnsetValue;

        }
    }
        
    [ValueConversion(typeof(Boolean), typeof(Brush))]
    public class convBoolBrush : IValueConverter
    {
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
         
            return DependencyProperty.UnsetValue;
        }
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                var valor = System.Convert.ToBoolean(value);
                if(valor){
                    return new BrushConverter().ConvertFromString("#FFA6DAFF");
                }
                else{
                    return new BrushConverter().ConvertFromString("#FFFFFF");
                }
            }
            return DependencyProperty.UnsetValue;
        }
    }
}
